package cn.fansunion.leecode.string;

/**
 * 反转字符串 <br/>
 * 
 * 编写一个函数，其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
 * 
 * 不要给另外的数组分配额外的空间，你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
 * 
 * 来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/reverse-string 
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * 
 * @author wen.lei@brgroup.com
 *
 *         2022-1-28
 */
public class ReverseString {

    // 示例 1：
    // 输入：s = ["h","e","l","l","o"]
    // 输出：["o","l","l","e","h"]
    // 示例 2：

    // 输入：s = ["H","a","n","n","a","h"]
    // 输出：["h","a","n","n","a","H"]
    public void reverseString(char[] s) {
        if (s == null || s.length <= 1) {
            return;
        }
        int maxIndex = s.length / 2;
        char tmp = 0;
        int endIndex = s.length - 1;
        for (int index = 0; index < maxIndex; index++) {
            //找对称的位置
            int swapIndex = endIndex- index;
            swap(s, index, swapIndex,tmp);
        }
    }

    /**
     * 交换数组中的2个元素，要求空间O(1)，传过来。子方法，确保代码清晰
     * @param s
     * @param swapIndex1
     * @param swapIndex2
     * @param tmp
     */
    private void swap(char[] s, int swapIndex1, int swapIndex2, char tmp) {
        if (s == null) {
            throw new NullPointerException("char array is null");
        }
        if (swapIndex1 < 0 || swapIndex1 > s.length - 1) {
            throw new IllegalArgumentException("swapIndex1 out of bound");
        }
        if (swapIndex2 < 0 || swapIndex2 > s.length - 1) {
            throw new IllegalArgumentException("swapIndex2 out of bound");
        }
        if(swapIndex1 == swapIndex2) {
            return;
        }
        tmp = s[swapIndex1];
        s[swapIndex1]=s[swapIndex2];
        s[swapIndex2]=tmp;
    }
}
